#pragma once

//#include <srs_app_http_client.hpp>
#include <srs_core.hpp>

#include <string>

#ifdef SRS_AUTO_HTTP_CORE

#include <srs_app_st.hpp>

class SrsHttpUri;
class SrsHttpParser;
class ISrsHttpMessage;
class SrsStSocket;

// the default timeout for http client.
#define SRS_HTTP_CLIENT_TIMEOUT_US (int64_t)(30*1000*1000LL)

/**
* http client to GET/POST/PUT/DELETE uri
*/
class SrsHttpClient {
private:
#ifndef WIN32
    bool connected;
    st_netfd_t stfd;
    SrsStSocket* skt;
    SrsHttpParser* parser;
    int64_t timeout_us;
#endif
private:
    // host name or ip.
    std::string host;
    int port;
public:
    SrsHttpClient();
    virtual ~SrsHttpClient();
public:
    /**
    * initialize the client, connect to host and port.
    */
    virtual int initialize(const std::string& h, int p, int64_t t_us = SRS_HTTP_CLIENT_TIMEOUT_US);
public:
    /**
    * to post data to the uri.
    * @param the path to request on.
    * @param req the data post to uri. empty string to ignore.
    * @param ppmsg output the http message to read the response.
    */
    virtual int post(const std::string& path, const std::string& req, ISrsHttpMessage** ppmsg);
    /**
    * to get data from the uri.
    * @param the path to request on.
    * @param req the data post to uri. empty string to ignore.
    * @param ppmsg output the http message to read the response.
    */
    virtual int get(const std::string& path, const std::string& req, ISrsHttpMessage** ppmsg);
private:
    virtual void disconnect();
    virtual int connect();
};

#endif
